/**
 * 
 */
package comunicaciones;

import java.io.DataOutputStream;
import java.io.DataInputStream;
import java.io.IOException; //import java.io.ObjectOutputStream;
import java.net.Socket; //import java.net.SocketException;
import automatas.AutomataMaestro;

/**
 * @author hvc
 * 
 */
public class TratarBuzones extends Peticion {

	private int PUERTO = 50000;
	private DataOutputStream buffer_out;
	private DataInputStream buffer_in;
	private Socket socket;
	private AutomataMaestro maestro;

	/**
	 *
	 */
	public TratarBuzones() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * @param puerto
	 */
	public TratarBuzones(AutomataMaestro maestro, int puerto) {
		// TODO Auto-generated constructor stub
		this.PUERTO = puerto;
		this.maestro = maestro;
	}

	/**
	 * @param socket
	 * @param puerto
	 */
	public TratarBuzones(AutomataMaestro maestro, Socket socket, int puerto) {
		super(socket);
		// TODO Auto-generated constructor stub
		this.socket = socket;
		this.PUERTO = puerto;
		this.maestro = maestro;

		try {
			this.buffer_out = new DataOutputStream(socket.getOutputStream());
			this.buffer_in = new DataInputStream(socket.getInputStream());
		} catch (IOException e) {
			System.out.println("TratarBuzones("+this.getId()+")-: Un error de E/S ha ocurrido cuando se ha creado la flujo de datos de salida o el socket no esta conectado");
			//e.printStackTrace();
			// cliente.close();
			//System.exit(1);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see comunicaciones.Peticion#crear(java.net.Socket)
	 */
	@Override
	public Peticion crear(Socket socket) {
		// TODO Auto-generated method stub
		return new TratarBuzones(maestro, socket, PUERTO);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see comunicaciones.Peticion#run()
	 */
	@Override
	public void run() {
		// TODO Auto-generated method stub
		// ******** CAMBIAR EL NUMERO DE PUERTO, HACERLO CON CLASE ESTATICA
		// ****//
		long puerto = PUERTO + this.getId();
		String esclavo = "";
		if (buffer_out == null || buffer_in == null) {
			try {
				this.buffer_out = new DataOutputStream(socket.getOutputStream());
				this.buffer_in = new DataInputStream(socket.getInputStream());
			} catch (IOException e) {
				System.out.println("TratarBuzones("+this.getId()+")-: Un error de E/S ha ocurrido cuando se ha creado la flujo de datos de salida o el socket no esta conectado");
				e.printStackTrace();
				// cliente.close();
				System.exit(1);
			}
		}
		try {
			buffer_out.writeLong(puerto);
			System.out.println("TratarBuzones("+this.getId()+")-: Enviado " + puerto);
			buffer_out.flush();
			esclavo = buffer_in.readUTF();
		} catch (IOException e) {
			System.out.println("TratarBuzones("+this.getId()+")-: Ha ocurrido un error de E/S");
			e.printStackTrace();
			//cliente.close();
			System.exit(1);
		}
		new BuzonMaestro(maestro, esclavo, (int) puerto).run();
		System.out.println("TratarBuzones("+this.getId()+")-: BuzonMaestro creado.");
		try {
			this.socket.close();
			// this.buffer_in.close();
			// this.buffer_out.close();
		} catch (IOException e) {
			System.out.println("TratarBuzones("+this.getId()+")-: Ha ocurrido un error de E/S cuando se cerraba los sockets.");
			e.printStackTrace();
			System.exit(1);
		}
	}
}
